package com.yupi.springbootinit.statemachine.processor;

import com.yupi.springbootinit.statemachine.core.StateContext;
import com.yupi.springbootinit.statemachine.core.StateProcessor;
import com.yupi.springbootinit.statemachine.enums.OrderEventEnum;
import com.yupi.springbootinit.statemachine.enums.OrderStateEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 订单状态处理器
 * 处理订单状态转换的业务逻辑
 */
@Slf4j
@Component
public class OrderStateProcessor implements StateProcessor<OrderStateEnum, OrderEventEnum> {
    
    @Override
    public boolean beforeTransition(StateContext context) {
        log.info("订单状态转换前置处理: 实体[{}] {} -> {}", 
            context.getEntityId(),
            context.getCurrentState().getCode(),
            context.getTargetState().getCode());
        
        // 根据不同的状态转换执行不同的业务逻辑
        OrderStateEnum currentState = (OrderStateEnum) context.getCurrentState();
        OrderStateEnum targetState = (OrderStateEnum) context.getTargetState();
        
        switch (currentState) {
            case CREATED:
                return handleCreatedToRoutingPublished(context);
            case ROUTING_PUBLISHED:
                return handleRoutingPublishedToSchedulePublished(context);
            case SCHEDULE_PUBLISHED:
                return handleSchedulePublishedToProducing(context);
            case PRODUCING:
                return handleProducingToInspecting(context);
            case INSPECTING:
                return handleInspectingToCompleted(context);
            default:
                return true;
        }
    }
    
    @Override
    public void afterTransition(StateContext context) {
        log.info("订单状态转换后置处理: 实体[{}] 转换完成", context.getEntityId());
        
        // 发送通知消息
        sendNotification(context);
        
        // 更新相关业务数据
        updateRelatedData(context);
    }
    
    @Override
    public void onTransitionError(StateContext context, Exception exception) {
        log.error("订单状态转换失败: 实体[{}] {} -> {}, 错误: {}", 
            context.getEntityId(),
            context.getCurrentState().getCode(),
            context.getTargetState().getCode(),
            exception.getMessage());
        
        // 记录错误日志
        // 发送告警通知
    }
    
    @Override
    public String getSupportedStateType() {
        return "ORDER";
    }
    
    /**
     * 处理已创建到工艺已发布的转换
     */
    private boolean handleCreatedToRoutingPublished(StateContext context) {
        // 检查工艺单是否已发布
        Long orderId = context.getEntityId();
        log.debug("检查订单[{}]的工艺单状态", orderId);
        
        // 这里可以调用工艺单服务检查状态
        // ProcessSheet processSheet = processSheetService.getByOrderId(orderId);
        // return processSheet != null && processSheet.getStatus() == ProcessSheetStateEnum.PUBLISHED;
        
        return true; // 简化处理，实际应检查工艺单状态
    }
    
    /**
     * 处理工艺已发布到排期已发布的转换
     */
    private boolean handleRoutingPublishedToSchedulePublished(StateContext context) {
        // 检查PMC是否已制定生产排期
        Long orderId = context.getEntityId();
        log.debug("检查订单[{}]的生产排期", orderId);
        
        return true; // 简化处理
    }
    
    /**
     * 处理排期已发布到生产中的转换
     */
    private boolean handleSchedulePublishedToProducing(StateContext context) {
        // 检查生产工单是否已创建
        Long orderId = context.getEntityId();
        log.debug("检查订单[{}]的生产工单", orderId);
        
        return true; // 简化处理
    }
    
    /**
     * 处理生产中到检验中的转换
     */
    private boolean handleProducingToInspecting(StateContext context) {
        // 检查生产工单是否已完成
        Long orderId = context.getEntityId();
        log.debug("检查订单[{}]的生产完成情况", orderId);
        
        return true; // 简化处理
    }
    
    /**
     * 处理检验中到已完成的转换
     */
    private boolean handleInspectingToCompleted(StateContext context) {
        // 检查质检是否通过
        Long orderId = context.getEntityId();
        log.debug("检查订单[{}]的质检结果", orderId);
        
        return true; // 简化处理
    }
    
    /**
     * 发送通知消息
     */
    private void sendNotification(StateContext context) {
        // 根据状态转换发送不同的通知
        OrderStateEnum targetState = (OrderStateEnum) context.getTargetState();
        
        switch (targetState) {
            case ROUTING_PUBLISHED:
                // 通知PMC工艺已发布
                log.info("通知PMC: 订单[{}]工艺已发布", context.getEntityId());
                break;
            case SCHEDULE_PUBLISHED:
                // 通知生产部排期已发布
                log.info("通知生产部: 订单[{}]排期已发布", context.getEntityId());
                break;
            case PRODUCING:
                // 通知相关部门生产已开始
                log.info("通知相关部门: 订单[{}]生产已开始", context.getEntityId());
                break;
            case INSPECTING:
                // 通知品质部进行检验
                log.info("通知品质部: 订单[{}]待检验", context.getEntityId());
                break;
            case COMPLETED:
                // 通知项目部订单已完成
                log.info("通知项目部: 订单[{}]已完成", context.getEntityId());
                break;
        }
    }
    
    /**
     * 更新相关业务数据
     */
    private void updateRelatedData(StateContext context) {
        // 更新订单表的状态字段
        // 更新相关统计数据
        // 触发其他业务流程
        log.debug("更新订单[{}]相关业务数据", context.getEntityId());
    }
}